import { Request, Response } from 'express';
import multer from 'multer';
import path from 'path';
import fs from 'fs';
import crypto from 'crypto';

// 配置存储
const storage = multer.diskStorage({
  destination: (req, file, cb) => {
    const uploadDir = path.join(__dirname, '../../uploads/ppt');
    
    // 确保目录存在
    if (!fs.existsSync(uploadDir)) {
      fs.mkdirSync(uploadDir, { recursive: true });
    }
    
    cb(null, uploadDir);
  },
  filename: (req, file, cb) => {
    // 生成唯一文件名
    const uniqueSuffix = Date.now() + '-' + Math.round(Math.random() * 1E9);
    const ext = path.extname(file.originalname);
    cb(null, `${uniqueSuffix}${ext}`);
  }
});

// 文件大小限制 50MB
const fileSizeLimit = 50 * 1024 * 1024;

// 创建multer实例
const upload = multer({
  storage,
  limits: {
    fileSize: fileSizeLimit
  },
  fileFilter: (req, file, cb) => {
    // 允许的文件类型
    const allowedTypes = [
      '.doc', '.docx', '.pdf', '.ppt', '.pptx', '.txt', '.md',
      '.xls', '.xlsx', '.csv', '.html', '.epub', '.mobi', '.xmind', '.mm'
    ];
    
    const ext = path.extname(file.originalname).toLowerCase();
    
    if (!allowedTypes.includes(ext)) {
      return cb(new Error('不支持的文件类型'));
    }
    
    cb(null, true);
  }
}).array('file', 5); // 最多允许上传5个文件

// 创建PPT任务
export const createTask = async (req: Request, res: Response) => {
  try {
    // 使用multer上传文件
    upload(req, res, async (err) => {
      if (err) {
        console.error('文件上传失败:', err);
        return res.status(400).json({
          code: 400,
          message: err.message || '文件上传失败'
        });
      }
      
      // 获取表单数据
      const { type, content } = req.body;
      const files = req.files as Express.Multer.File[];
      
      // 验证必要参数
      if (!type) {
        return res.status(400).json({
          code: 400,
          message: '缺少必要参数: type'
        });
      }
      
      // 验证type格式
      const validTypes = ['1', '2', '3', '4', '5', '6', '7'];
      if (!validTypes.includes(type)) {
        return res.status(400).json({
          code: 400,
          message: 'type参数无效，有效值为1-7'
        });
      }
      
      // 根据不同type验证参数
      if (type === '1' && !content && (!files || files.length === 0)) {
        return res.status(400).json({
          code: 400,
          message: 'type=1时，content或file至少提供一个'
        });
      }
      
      if (type === '2' && (!files || files.length === 0)) {
        return res.status(400).json({
          code: 400,
          message: 'type=2时，file是必需的'
        });
      }
      
      if (type === '3') {
        if ((!content || !content.trim()) && (!files || files.length === 0)) {
          return res.status(400).json({
            code: 400,
            message: 'type=3时，content(分享链接)或file(思维导图文件)是必需的'
          });
        }
        
        if (files && files.length > 1) {
          return res.status(400).json({
            code: 400,
            message: 'type=3时，只能上传一个思维导图文件'
          });
        }
      }
      
      if (type === '4') {
        if (!files || files.length === 0) {
          return res.status(400).json({
            code: 400,
            message: 'type=4时，file(Word文件)是必需的'
          });
        }
        
        if (files.length > 1) {
          return res.status(400).json({
            code: 400,
            message: 'type=4时，只能上传一个Word文件'
          });
        }
      }
      
      if (type === '5' && (!content || !content.trim())) {
        return res.status(400).json({
          code: 400,
          message: 'type=5时，content(网页链接)是必需的'
        });
      }
      
      if (type === '6' && (!content || !content.trim())) {
        return res.status(400).json({
          code: 400,
          message: 'type=6时，content(文本内容)是必需的'
        });
      }
      
      if (type === '7' && (!content || !content.trim())) {
        return res.status(400).json({
          code: 400,
          message: 'type=7时，content(Markdown大纲)是必需的'
        });
      }
      
      // 内容长度验证
      if (type === '1' && content && content.length > 1000) {
        return res.status(400).json({
          code: 400,
          message: '主题或要求不能超过1000字符'
        });
      }
      
      if (type === '6' && content && content.length > 20000) {
        return res.status(400).json({
          code: 400,
          message: '文本内容不能超过20000字符'
        });
      }
      
      // 生成唯一任务ID
      const taskId = `task_${crypto.randomBytes(16).toString('hex')}`;
      
      // 处理上传的文件
      const fileInfos = files ? files.map(file => ({
        filename: file.filename,
        originalname: file.originalname,
        path: file.path,
        size: file.size
      })) : [];
      
      // 创建任务记录
      const task = {
        id: taskId,
        type,
        content: content || '',
        files: fileInfos,
        createTime: new Date().toISOString(),
        status: 'pending' // 任务状态：pending, processing, completed, failed
      };
      
      // TODO: 保存任务信息到数据库
      console.log('创建PPT任务:', task);
      
      // 异步处理任务
      // TODO: 实现任务队列和处理逻辑
      
      return res.json({
        code: 0,
        message: '操作成功',
        data: {
          id: taskId
        }
      });
    });
  } catch (error) {
    console.error('创建PPT任务失败:', error);
    return res.status(500).json({
      code: 500,
      message: error instanceof Error ? error.message : '创建PPT任务失败'
    });
  }
};
